package cn.lg.soar.redis.config;

import cn.lg.soar.redis.serializer.*;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * redis配置类
 * @Author: lgx
 */
@Configuration
@ConditionalOnProperty(value = "lg.redis.enabled", havingValue = "true", matchIfMissing = true)
public class RedisConfig {

    private final StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

    /**
     * 使用简单，傻瓜式自动序列化
     * @param factory
     * @return
     */
    @Primary
    @Bean
    public RedisTemplate<String, Object> redis(RedisConnectionFactory factory) {

        RedisTemplate<String, Object> redis = new RedisTemplate<>();
        // 配置连接工厂
        redis.setConnectionFactory(factory);

        // 使用 StringRedisSerializer 来序列化和反序列化redis的key值
        redis.setKeySerializer(this.stringRedisSerializer);

        SoarRedisSerializer serializer = new SoarRedisSerializer();
        // 值采用 json 序列化
        redis.setDefaultSerializer(serializer);

        redis.setStringSerializer(this.stringRedisSerializer);
        redis.setValueSerializer(serializer);

        // 设置 hash 序列化模式
        redis.setHashKeySerializer(this.stringRedisSerializer);
        redis.setHashValueSerializer(serializer);
        redis.afterPropertiesSet();

        return redis;
    }

    /**
     * 专门用于存储 long 值
     * @param factory
     * @return
     */
    @Lazy
    @Bean
    public RedisTemplate<String, Long> longRedisTemplate(RedisConnectionFactory factory) {

        RedisTemplate<String, Long> redis = new RedisTemplate<>();
        // 配置连接工厂
        redis.setConnectionFactory(factory);

        // 使用 StringRedisSerializer 来序列化和反序列化redis的key值
        redis.setKeySerializer(this.stringRedisSerializer);

        LongRedisSerializer redisSerializer = new LongRedisSerializer();
        // 设置 value 序列化模式
        redis.setStringSerializer(this.stringRedisSerializer);
        redis.setValueSerializer(redisSerializer);

        // 设置 hash 序列化模式
        redis.setHashKeySerializer(this.stringRedisSerializer);
        redis.setHashValueSerializer(redisSerializer);
        redis.afterPropertiesSet();

        return redis;
    }

    /**
     * 专门用于存储 int 值
     * @param factory
     * @return
     */
    @Lazy
    @Bean
    public RedisTemplate<String, Integer> intRedisTemplate(RedisConnectionFactory factory) {

        RedisTemplate<String, Integer> redis = new RedisTemplate<>();
        // 配置连接工厂
        redis.setConnectionFactory(factory);

        // 使用 StringRedisSerializer 来序列化和反序列化redis的key值
        redis.setKeySerializer(this.stringRedisSerializer);

        IntegerRedisSerializer redisSerializer = new IntegerRedisSerializer();
        // 设置 value 序列化模式
        redis.setStringSerializer(this.stringRedisSerializer);
        redis.setValueSerializer(redisSerializer);

        // 设置 hash 序列化模式
        redis.setHashKeySerializer(this.stringRedisSerializer);
        redis.setHashValueSerializer(redisSerializer);
        redis.afterPropertiesSet();

        return redis;
    }

    /**
     * 专门用于存储 Boolean 值
     * @param factory
     * @return
     */
    @Lazy
    @Bean
    public RedisTemplate<String, Boolean> booleanRedisTemplate(RedisConnectionFactory factory) {

        RedisTemplate<String, Boolean> redis = new RedisTemplate<>();
        // 配置连接工厂
        redis.setConnectionFactory(factory);

        // 使用 StringRedisSerializer 来序列化和反序列化redis的key值
        redis.setKeySerializer(this.stringRedisSerializer);

        BooleanRedisSerializer redisSerializer = new BooleanRedisSerializer();
        // 设置 value 序列化模式
        redis.setStringSerializer(this.stringRedisSerializer);
        redis.setValueSerializer(redisSerializer);

        // 设置 hash 序列化模式
        redis.setHashKeySerializer(this.stringRedisSerializer);
        redis.setHashValueSerializer(redisSerializer);
        redis.afterPropertiesSet();

        return redis;
    }

    /**
     * 专门用于存储 Boolean 值
     * @param factory
     * @return
     */
    @Lazy
    @Bean
    public RedisTemplate<String, byte[]> byteArrayRedisTemplate(RedisConnectionFactory factory) {

        RedisTemplate<String, byte[]> redis = new RedisTemplate<>();
        // 配置连接工厂
        redis.setConnectionFactory(factory);

        // 使用 StringRedisSerializer 来序列化和反序列化redis的key值
        redis.setKeySerializer(this.stringRedisSerializer);

        ByteArrayRedisSerializer redisSerializer = new ByteArrayRedisSerializer();
        // 设置 value 序列化模式
        redis.setStringSerializer(this.stringRedisSerializer);
        redis.setValueSerializer(redisSerializer);

        // 设置 hash 序列化模式
        redis.setHashKeySerializer(this.stringRedisSerializer);
        redis.setHashValueSerializer(redisSerializer);
        redis.afterPropertiesSet();

        return redis;
    }

}
